La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
La plateforme propose quelques outils de purge de la mémoire :
Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S
est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.
A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.
pip install jupyterlab
jupyter notebook
Quelques fonctions utiles dans la suite.
from math import *
from matplotlib.pyplot import *
Voici l'exemple canonique.
Ainsi on a par exemple $ -3n^2-2n+100\sim -3n^2$ . Cela signifie que pour de grande valeur de $n$ le nombre $-3n^2-2n+100$ et le nombre $-3n^2$ sont relativement proche.
f1(n)
qui renvoie $-3n^2-2n+100$f2(n)
qui renvoie $-3n^2$f1(n)
et f2(n)
pour $n\in\{10, 100, 1000, 10000, 100000, 1000000\}$#1
def f1(n) : return -3*n**2-2*n+100
#2
def f2(n) : return -3*n**2
#3
for i in range(1, 7) :
n=10**i
print("n =", n)
print("\tf1(n) =", f1(n))
print("\tf2(n) =", f2(n))
Pour s'en convaincre une bonne fois pour toute, réalisons le graphique de ces deux suites (on choisit différents intervalles pour observer l'écart relatif).
for n in [5, 10, 20, 50] :
N=list(range(n+1))
y1=[f1(n) for n in N]
y2=[f2(n) for n in N]
plot(N, y1, 'r', label="$-3x^2-2x+100$")
plot(N, y2, 'b.', label="$-3x^2$")
title("Comparaison des deux suites sur l'intervale $[0 ; "+str(n)+"]$")
grid(True)
legend()
show()
En imitant le code précédent, comparer $u_n=\dfrac{n+1}{\sqrt{n}+1}$ et $v_n=\sqrt{n}$, à l'aide d'un graphique. En déduire la limite de $u_n$.
n=1000
N=list(range(n+1))
y1=[(n+1)/(sqrt(n)+1) for n in N]
y2=[sqrt(n) for n in N]
plot(N, y1, 'r', label="$\dfrac{n+1}{\sqrt{n}+1}$")
plot(N, y2, 'b.', label="$\sqrt{n}$")
title("Comparaison des deux suites sur l'intervale $[0 ; "+str(n)+"]$")
grid(True)
legend()
show()
Trouver un équivalent à $u_n=\dfrac{3n-1}{n^2+n+1}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de $u_n$.
#u_n~3/n
n=30
N=list(range(1, n+1))
y1=[(3*n-1)/(n**2+n+1) for n in N]
y2=[3/n for n in N]
plot(N, y1, 'r', label="$\dfrac{3n-1}{n^2+n+1}$")
plot(N, y2, 'b.', label="$\dfrac{3}{n}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()
Trouver un équivalent à $u_n=\dfrac{n^2-n+1}{n^2+n+1}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de $u_n$.
#u_n~1
n=500
N=list(range(n+1))
y1=[(n**2-n+1)/(n**2+n+1) for n in N]
y2=[1 for n in N]
plot(N, y1, 'r', label="$\dfrac{n^2-n+1}{n^2+n+1}$")
plot(N, y2, 'b.', label="$1$")
title("Comparaison des deux suites sur l'intervale $[0 ; "+str(n)+"]$")
grid(True)
legend()
show()
Ecrire les fonctions Factoriel(n)
et Stirling(n)
qui renvoient respectivement $n!$ et $\sqrt{2\pi n}\left(\dfrac{n}{e}\right)^n$.
La troisième case permettra de visualiser les différentes valeurs de ces fonctions et de comparer les courbes, qui tendent à se rapprocher.
def Factoriel(n) :
try : n=int(n)
except : return 0
if(n<=1) : return 1
res=1
for i in range(2, n+1) : res*=i
return res
def Stirling(n) : return (sqrt(2*pi*n))*((n/exp(1))**n)
for n in [3, 10, 25] :
x=list(range(0, n+1))
y1=[Factoriel(n) for n in x]
y2=[Stirling(n) for n in x]
plot(x, y1, 'r', label="n!")
plot(x, y2, 'b.', label="Stirling")
title("Représentation de $n!$ et son équivalent sur $[0 ; "+str(n)+"]$")
legend()
grid(True)
show()
Trouver un équivalent à $u_n=\left(e^{\frac{1}{n}}-1\right)ln\left(\dfrac{n+1}{n}\right)$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de cette suite.
#u_n~(1/n)(1/n)=1/n²
n=100
N=list(range(1,n+1))
y1=[(exp(1/n)-1)*log((n+1)/n) for n in N]
y2=[1/n*2 for n in N]
plot(N, y1, 'r', label="$(e^{\dfrac{1}{n}}-1)ln(\dfrac{n+1}{n})$")
plot(N, y2, 'b.', label="$\dfrac{1}{n^2}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()
Trouver un équivalent à $u_n=\dfrac{n^{\frac{2n+1}{2}}e^{-n}}{n!}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de cette suite.
#u_n~1/r(2pi)
n=100
N=list(range(1,n+1))
y1=[(n**((2*n+1)/2)*exp(-n))/Factoriel(n) for n in N]
y2=[1/sqrt(2*pi) for n in N]
plot(N, y1, 'r', label="$\dfrac{n^{\dfrac{2n+1}{2}}e^{-n}}{n!}$")
plot(N, y2, 'b.', label="$\dfrac{1}{\sqrt{2\pi}}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()
Trouver un équivalent à $u_n=n^\alpha\sqrt{1-cos\left(\dfrac{1}{n}\right)}$ pour tout $a\in \mathbb{R}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de cette suite.
#u_n~n^(alpha-1)/r(2)
for a in [-10, -1, 0, 1, 5] :
n=25
N=list(range(1,n+1))
y1=[n**a*sqrt(1-cos(1/n)) for n in N]
y2=[n**(a-1)/sqrt(2) for n in N]
plot(N, y1, 'r', label="$n^{"+str(a)+"}\sqrt{1-cos(\dfrac{1}{n})}$")
plot(N, y2, '.b', label="$\dfrac{n^{"+str(a-1)+"}}{\sqrt{2}}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()
L'ordinateur est dans le fond un objet de calcul plutôt élementaire. Le ou de la logique est en fait une addition et le et une multiplication. En s'appuyant sur ces outils, en rajoutant un bit de signe par exemple, on peut définir assez facilement la soustracion et un peu moins facilement la division. En bref, les quatres opérations élémentaires se programment assez facilement en bas niveau. Mais comment fait l'ordinateur pour calculer une racine carré par exemple ? On peut démontrer que la suite $ \left\{ \begin{array}{rcl} u_0&=&1\\ u_{n+1}&=& \dfrac{1}{2}\left(u_n+\dfrac{2}{u_n}\right) \end{array} \right. $ tend vers $\sqrt{2}$.
#1
N=5
U=[1]
for n in range(N) :
u=U[-1]
U.append(0.5*(u+2/u))
for n in range(N+1) :
print("U_"+str(n)+" =", U[n])
#2
s=sqrt(2)
print("Valeur de python de racine de 2 =", s)
for decimale in [5, 10, 15] :
n=0
u=1
while(abs(u-s)>10**(-decimale)) :
n+=1
u=0.5*(u+2/u)
print("Ma valeur de racine de 2 :", u, "otenue en", n, "itérations")
#3
s=sqrt(5)
print("Valeur de python de racine de 5 =", s)
for decimale in [5, 10, 15] :
n=0
u=1
while(abs(u-s)>10**(-decimale)) :
n+=1
u=0.5*(u+5/u)
print("Ma valeur de racine de 5 :", u, "otenue en", n, "itérations")
#4
e=exp(1)
print("Valeur de python de e =", e)
n=0
while(abs(u-e)>10**(-3)) :
n+=1
u=(1+1/n)**n
print("Ma valeur de e :", u, "otenue en", n, "itérations")
On considère la suite $ \left\{ \begin{array}{rcl} u_0&=&0.2\\ u_{n+1}&=&-\dfrac{1}{2}u_n+1 \end{array} \right. $
U_n
qui prend en paramètre un entier $n$ et qui renvoie la liste des $n+1$ premier terme de la suite (de $u_0$ à $u_n$).
X_n
et Y_n
qui prennent en paramètre un entier $n$ et la liste U
des termes de la suite et qui renvoient les coordonnées des points éponymes. Ces coordonnées pourront être stockées dans un tableau ou dans un tuple.
#1
def U_n(n) :
if(n==0) : return [0.2]
X=U_n(n-1)
u=X[-1]
X.append(-1/2*u+1)
return X
#2
plot([0, 1], [1, 1/2], 'b')
xlim(0, 1)
ylim(0, 1)
title("Question 2")
grid(True)
show()
#3
plot([0,1], [0,1], 'g')
plot([0, 1], [1, 1/2], 'b')
xlim(0, 1)
ylim(0, 1)
title("Question 3")
grid(True)
show()
#4
def X_n(n, U) :
return [U[n], U[n+1]]
def Y_n(n, U) :
return [U[n], U[n]]
#5
N=8
U=U_n(N+2)
for n in range(N) :
A=X_n(n, U)
B=Y_n(n+1, U)
C=X_n(n+1, U)
plot([A[0], B[0], C[0]], [A[1], B[1], C[1]], 'r')
plot([0,1], [0,1], 'g')
plot([0, 1], [1, 1/2], 'b')
xlim(0, 1)
ylim(0, 1)
title("Question 5")
grid(True)
show()
#6
#La limite à l'air d'être 0.65
Même exercice que précédement avec la suite $ \left\{ \begin{array}{rcl} u_0&=&1\\ u_{n+1}&=&sin(u_n) \end{array} \right. $
def U_n(n) :
if(n==0) : return [1]
X=U_n(n-1)
u=X[-1]
X.append(sin(u))
return X
def X_n(n, U) :
return [U[n], U[n+1]]
def Y_n(n, U) :
return [U[n], U[n]]
N=100
U=U_n(N+2)
for n in range(N) :
A=X_n(n, U)
B=Y_n(n+1, U)
C=X_n(n+1, U)
plot([A[0], B[0], C[0]], [A[1], B[1], C[1]], 'r')
plot([0,1], [0,1], 'g', lw="0.3")
X=[k/1000 for k in range(1001)]
Y=[sin(x) for x in X]
plot(X, Y, 'b', lw="0.3")
xlim(0, 1)
ylim(0, 1)
grid(True)
show()
#La limite à l'air d'être 0